package 真题;/**
 * @author： li
 * @date： 2022-01-24 11:32
 * @version 1.0
 */

/*【问题描述】
你有一架天平和N个砝码，这N个砝码重量依次是W1, W2,… ， WN.请你计算一共可以称出多少种不同的重量?
注意砝码可以放在天平两边。
【输入格式】
输入的第一行包含一个整数N。
第二行包含N个整数:Wl，W，W3，.… . , WN。
【输出格式】
输出一个整数代表答案。
【样例输入】
3
1 4 6
【样例输出】
10
【样例说明】
能称出的10种重量是:1、2、3、4、5、6、7、9、10、11.
1 = 1;
2=6-4 (天平一边放6，另一边放4);
3=4-1;
4=4;
5=6-1;
6=6;
7 =1＋6;
9 =4＋6-1;
10=4＋6;
11=1＋4＋6。
【评测用例规模与约定】
对于50%的评测用例，1≤N ≤ 15。
对于所有评测用例，1≤N ≤ 100，N个砝码总重不超过100000。

 */
import java.util.HashSet;
import java.util.Scanner;
public class 砝码称重 {
    public static void main(String[] args) {
        Scanner in =new Scanner(System.in);
        int N,i,temp,tt;
        N=in.nextInt();
        int[] num=new int[N+1];
        for ( i = 1; i <=N; i++)
            num[i]=in.nextInt();

        HashSet<Integer> contain =new HashSet<>();
        HashSet<Integer> a =new HashSet<>();        //存放中间变量，一次遍历中，容器不存在 的数
        contain.add(num[1]);     //先将第一个元素填入到容器

        for(i=2;i<=N;i++) {
            for (Integer integer : contain) {
//                System.out.println("integer="+integer);
                tt = integer;
                temp = tt + num[i];//放同一边
                if (temp != 0 && temp < 100000)
                        a.add(temp);
                temp = tt - num[i];//放两边
                temp = Math.abs(temp);
                if (temp != 0 && temp < 100000)
                        a.add(temp);
            }
            contain.addAll(a);
            a.clear();
            contain.add(num[i]);
        }
        System.out.println(contain);
        System.out.println(contain.size());
    }
}

